iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 6
1
Software Development

Ruby 研究 30 天系列 第 6

Day 5 - Hash

  • 分享至 

  • xImage
  •  

Hash

雜湊表(Hash table,也叫哈希表),是根據鍵(Key)而直接查詢在內存存儲位置的資料結構。 - 維基百科

Hash 在 Ruby 有兩種寫法,新式寫法寫起來就像 JSON ,鍵與值之間用冒號 : 分割,但兩種寫法本質上是一樣的:

old_hash = { :name => "Karen", :age => 18 }  # 舊寫法

new_hash = { name: "Karen", age: 18 }       # 新寫法

# 印出 {:name => "Karen", :age => 18}

其實它就是 key - value pairs 的集合,拿對鑰匙就能拿對值:

profile = { :name => "Karen", :age => 18 } 
profile.keys        # 印出 [:name, :age]
profile.values      # 印出 ["Karen", 18]

之前我們對字串或是陣列取值時,我們可以照 index 取:

"我是不是很可愛"[1]      # 印出 " 是 "
[1, 2, 3, 4, 5][0]     # 印出 1

hash 是無序的元素集合,你可以想成它是用 key 來當索引的:

profile = { :name => "Karen", :age => 18 } 
profile[1]            # 印出 nil
profile[:name]        # 印出 "Karen"

雖然 class 還沒分享過,以下先假設一個自我介紹的情境,必須 依序 帶入參數 nameage 好讓句子完整呈現:

class Introduction
  def initialize(name, age)
    @name = name
    @age = age
  end

  def say
    puts " 我的名字是 #{@name},今年 #{@age} 歲。"
  end
end
Karen = Introduction.new("Karen", 18)
Karen.say

# 印出 我的名字是 Karen,今年 18 歲,

可是自介這麼短有點缺乏誠意,如果用上面的方式寫,要依照順序去填空,當資訊量變多時,也難保順序不會出錯,若是填錯就文不對題了,這時 hash 無序的特性就凸顯出來:

class Introduction
  def initialize(profile)
    @name = profile[:name]
    @age = profile[:age]
    @email = profile[:email]
    @city = profile[:city]
    @language = profile[:language]
  end

  def say
    puts "我的名字是 #{@name},今年 #{@age} 歲,可以用 #{@email} 聯絡我,標準#{@city}人,正在學習 #{@language},請多指教! "
  end
end
Karen = Introduction.new(name: "Karen", age: 18, email: "cute@cjhan.tw", city: "天龍", language: "Ruby")
Karen.say

# 印出以下內容
# 我的名字是 Karen,今年 18 歲,可以用 cute@cjhan.tw 聯絡我,標準天龍人,正在學習 Ruby,請多指教! 

就算帶入的參數順序調換,也不會影響我們要的結果:

# 承上
Karen = Introduction.new( city: "天龍", age: 18, email: "cute@cjhan.tw", name: "Karen", language: "Ruby" )
Karen.say

# 印出以下內容
# 我的名字是 Karen,今年 18 歲,可以用 cute@cjhan.tw 聯絡我,標準天龍人,正在學習 Ruby,請多指教!

那...我們的主題 hash 呢?在 Ruby 中,最後一個 {} 是可以省略的:

Karen = Introduction.new({name: "Karen", age: 18, email: "cute@cjhan.tw", city: "天龍", language: "Ruby"})

如同之前所分享的,這裡還可以省略小括號,得到的結果也不會改變:

Karen = Introduction.new name: "Karen", age: 18, email: "cute@cjhan.tw", city: "天龍", language: "Ruby" 

以下是 Rails 裡常出現的程式碼,猜猜這裡面有幾個參數?

link_to "⾸頁", root_path, class:"btn btn-default", method: "post", confirm: true

答案明天分享~

參考資料:
為你自己學 Ruby on Rails

此文同步刊登於CJ-Han的網站


上一篇
Day 4 - 迴圈與迭代
下一篇
Day 6 - Symbol in Ruby
系列文
Ruby 研究 30 天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言